package ferran.tomas.ta;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import android.util.Log;

import ferran.tomas.dominio.Checkpoint;
import ferran.tomas.dominio.Place;
import ferran.tomas.dominio.Producto;

/**
 * 
 */

/**
 * @author AJ
 *
 */
public class utilsXML {
	private static final double numeracoConversor = 0.000009;
	
	public static String XML_login(String nombre, String password) {
		Element mensaje = new Element("mensaje");
		Element login = new Element("login");
		
		login.setAttribute("username", nombre);
		login.setAttribute("password", password);
		
	    mensaje.addContent(login);
	    DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd);
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");
		
	}

	public static String XML_registro(String nombre, String password) {
		Element mensaje = new Element("mensaje");
		Element registro = new Element("registro");
		
		registro.setAttribute("username", nombre);
		registro.setAttribute("password", password);
		
	    mensaje.addContent(registro);
	    DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd);
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");
		
	}

	public static String XML_conexion(String nombre, String token, Double X, Double Y, int rango) {
		Element mensaje = new Element("mensaje");
		Element conexion = new Element("conexion");
		Element coordenadas = new Element("coordenadas");
		
		coordenadas.setAttribute("X", ""+X);
		coordenadas.setAttribute("Y", ""+Y);
		
		conexion.addContent(coordenadas);
		conexion.setAttribute("username", nombre);
		conexion.setAttribute("token", token);		
		conexion.setAttribute("rango", ""+(rango*numeracoConversor));
		
		mensaje.addContent(conexion);
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd);
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");
	}

	public static String XML_chat(String text, String origen, String destinatario, String token) {
		Element mensaje = new Element("mensaje");  
		Element chat = new Element("chat");
		Element contactoD = new Element("contacto");
		
		contactoD.setAttribute("username", destinatario);	
		
		chat.addContent(contactoD);
		chat.setAttribute("username", origen);
		chat.setAttribute("token", token);
		chat.setAttribute("mensaje", text);
		
		mensaje.addContent(chat);
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd); 
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");	
	}

	public static String XML_addproduct(String ID, String price, String rating, String amount) {
		Element mensaje = new Element("mensaje");  
		Element addProductos = new Element("addProductos");
		
		
		addProductos.setAttribute("id", ID);
		addProductos.setAttribute("precio", price);
		addProductos.setAttribute("rating", rating);
		addProductos.setAttribute("cantidad", amount);

		
		mensaje.addContent(addProductos);
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd); 
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");	
	}
	
	public static String XML_addcontacts(String username, String contacto) {
		Element mensaje = new Element("mensaje");  
		Element addContactos = new Element("addContacto");
		
		addContactos.setAttribute("username", username);

		addContactos.setAttribute("contacto", contacto);
	

		
		mensaje.addContent(addContactos);
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd); 
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");	
	}
	
	public static String XML_listProduct() {
		Element mensaje = new Element("mensaje");  
		Element listarProductos = new Element("listarProductos");
	
	
		mensaje.addContent(listarProductos);
		
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd); 
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");	
	}
	
	public static String XML_getItinerario(String nombre) {
		Element mensaje = new Element("mensaje");
		Element getItinerario = new Element("getItinerario");
		
		getItinerario.setAttribute("user", nombre);
		
		mensaje.addContent(getItinerario);
		DocType dtd = new DocType("mensaje", "mensaje.dtd");
		Document document = new Document(mensaje, dtd);
		
		XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		return outputter.outputString(document).replaceAll("\r\n","");
	}
	
	public static String XML_Favorito(String username, String favorito) {
		Element mensaje = new Element("mensaje");
        Element resRegistro = new Element("adFavorito");
 
    	resRegistro.setAttribute("username", username);
    	resRegistro.setAttribute("favorito", favorito);
        mensaje.addContent(resRegistro);
     
        DocType dtd = new DocType("mensaje", "mensaje.dtd");
        Document document = new Document(mensaje, dtd);

        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        return outputter.outputString(document).replaceAll("\r\n","");
	}
	
	public static String XML_getCheckpoints(String id) {
		Element mensaje = new Element("mensaje");
        Element getCheckpoint = new Element("listarCheckpoints");
        
    	getCheckpoint.setAttribute("itinerario", id);
        
    	mensaje.addContent(getCheckpoint);
     
        DocType dtd = new DocType("mensaje", "mensaje.dtd");
        Document document = new Document(mensaje, dtd);

        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        return outputter.outputString(document).replaceAll("\r\n","");
	}
	
   public static boolean ResFavoritoCorrecto(Document xml){
    	Element mensaje = xml.getRootElement();
        Element chat = mensaje.getChild("resAdFavorito");

        String uname = chat.getAttributeValue("resultado");
        if(uname.equals("true")) return true;
        else return false;
    }
	
	public static String extraeUsernameChat(Document xml) {
		Element mensaje = xml.getRootElement();
	    Element chat = mensaje.getChild("chat");
	
	    return chat.getAttributeValue("username");
	}
	
	public static String extraeMensaje(Document xml) {
	    Element mensaje = xml.getRootElement();
	    Element chat = mensaje.getChild("chat");
	
	    return chat.getAttributeValue("mensaje");
	}
	
	public static String extraeError(Document xml) {
	    Element mensaje = xml.getRootElement();
	    Element error = (Element)mensaje.getChildren().get(0);
	    
	    return error.getAttributeValue("mensaje");
	}
	

	public static String extraeUsuariError(Document xml) {
		Element mensaje = xml.getRootElement();
	    Element error = (Element)mensaje.getChildren().get(0);
	    
	    return error.getAttributeValue("username");
	}
	
	public static Document getXML(String msj) {
		Log.d("hola",msj);
		try {
		    SAXBuilder builder = new SAXBuilder();
	        builder.setValidation(false);
		    Document xml = builder.build(new StringReader(msj));
		    
		    return xml;
		    
		} 
		catch(JDOMException e) {
			e.printStackTrace();
			System.out.println("Error JDOM!: XML Incorrecto");
		}
		catch(IOException e) {
			e.printStackTrace();
			System.out.println("Error IO!");
		}
		
		return null;
	}
	
	public static String getXML_type(Document xml) {
	    Element mensaje = xml.getRootElement();
	    Element content = (Element)mensaje.getChildren().get(0);
	    
	    return content.getName();
	}

	public static String getToken(Document xmlRespuestaServidor) {
		Element mensaje = xmlRespuestaServidor.getRootElement();
	    Element respuestaLogin = mensaje.getChild("resLogin");
	
	    return respuestaLogin.getAttributeValue("token");
	}

	@SuppressWarnings("unchecked")
	public static ArrayList<String> getContactos(Document xmlRespuestaServidor) {
		 ArrayList<String> temp = new ArrayList<String>();
		 org.jdom.Element mensaje = xmlRespuestaServidor.getRootElement();
			org.jdom.Element respuestaLogin = mensaje.getChild("resLogin");
			List<org.jdom.Element> favs = (List<org.jdom.Element>) respuestaLogin.getChildren("contacto");
			int i = 0;
			while(i < favs.size()) {
				org.jdom.Element favElem = favs.get(i);
				String nombreUsuarioFavorito = favElem.getAttributeValue("username");
				temp.add(nombreUsuarioFavorito);
				++i;
			}
			
			return temp;
	}
	
	@SuppressWarnings("unchecked")
	public static ArrayList<Place> getPlaces(Document xmlRespuestaServidor) {
		ArrayList<Place> temp = null;
		org.jdom.Element respuestaLogin = xmlRespuestaServidor.getRootElement();
		if(respuestaLogin == null) Log.d("hola","respuesta login es nulo");
		if(respuestaLogin.getChildText("status").equals("OK")) {
			List<org.jdom.Element> favs = (List<org.jdom.Element>) respuestaLogin.getChildren("result");
			temp = new ArrayList<Place>(favs.size());
			int i = 0;
			while(i < favs.size()) {
				org.jdom.Element favElem = favs.get(i);
				String nombre = favElem.getChildText("name");
				Log.d("hola", "el nombre es "+nombre);
				List<org.jdom.Element> tipos = favElem.getChildren("type");
				String tipoEstablecimiento = tipos.get(0).getText();
				Log.d("hola", "el tipo de establecimiento es "+tipoEstablecimiento);

				String icon = favElem.getChildText("icon");
				org.jdom.Element elemGeo = favElem.getChild("geometry").getChild("location");
				
				String latitud = elemGeo.getChildText("lat");
				String longitud = elemGeo.getChildText("lng");
				
				Log.d("hola", "el geo es " + latitud+", "+longitud);

				
				temp.add(new Place(nombre, tipoEstablecimiento, icon, latitud, longitud));
				++i;
			}
		}	
		return temp;
	}

	public static String getItinerarioID(Document d) {
		Element mensaje = d.getRootElement();
	    Element respuestaLogin = mensaje.getChild("resItinerario");
	
	    return respuestaLogin.getAttributeValue("id");
	}

	@SuppressWarnings("unchecked")
	public static ArrayList<Checkpoint> getCheckpoints(Document xmlRespuestaServidor) {
		ArrayList<Checkpoint> temp = new ArrayList<Checkpoint>();
		 org.jdom.Element mensaje = xmlRespuestaServidor.getRootElement();
			org.jdom.Element resListarCheckpoints = mensaje.getChild("resListarCheckpoints");
			List<org.jdom.Element> checks = (List<org.jdom.Element>) resListarCheckpoints.getChildren("Checkpoint");
			int i = 0;
			while(i < checks.size()) {
				org.jdom.Element checksElem = checks.get(i);
				String fecha = checksElem.getAttributeValue("fecha");
				String id =  checksElem.getAttributeValue("id");
				String visitado = checksElem.getAttributeValue("visitado");
				String foto = checksElem.getAttributeValue("foto");
				String posicion = checksElem.getAttributeValue("posicion");
				
				temp.add(new Checkpoint(id,posicion,fecha,visitado,foto));
				++i;
			}
			
			return temp;
	}

	@SuppressWarnings("unchecked")
	public static ArrayList<Producto> getProducts(Document xmlRespuestaServidor) {
		ArrayList<Producto> temp = new ArrayList<Producto>();
		 org.jdom.Element mensaje = xmlRespuestaServidor.getRootElement();
			org.jdom.Element resListarProductos = mensaje.getChild("resListarProductos");
			List<org.jdom.Element> checks = (List<org.jdom.Element>) resListarProductos.getChildren("Producto");
			int i = 0;
			while(i < checks.size()) {
				org.jdom.Element checksElem = checks.get(i);
				String id = checksElem.getAttributeValue("id");
				String precio =  checksElem.getAttributeValue("precio");
				String rating = checksElem.getAttributeValue("rating");
				String cantidad = checksElem.getAttributeValue("cantidad");
				
				temp.add(new Producto(id,precio,rating,cantidad));
				++i;
			}
			
			return temp;
	}

		
}

